{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "toc": true
   },
   "source": [
    "<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
    "<div class=\"toc\"><ul class=\"toc-item\"></ul></div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import torch \n",
    "import torch.nn.functional as F\n",
    "from torch import nn\n",
    "import scipy.io as io\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from keras.utils import to_categorical\n",
    "from torch.optim import SGD, Adam\n",
    "from torch.utils import data\n",
    "\n",
    "device = 'cuda' if torch.cuda.is_available() else 'cpu'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_snr = 15\n",
    "M=16\n",
    "NN_T = 64\n",
    "NN_R=512"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "class Encoder(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Encoder, self).__init__()\n",
    "        self.fc1 = nn.Linear(M, NN_T)  # 6*6 from image dimension\n",
    "        self.fc2 = nn.Linear(NN_T, NN_T)\n",
    "        self.fc3 = nn.Linear(NN_T, 8)\n",
    "        \n",
    "    def forward(self, in_message):\n",
    "        x = F.relu(self.fc1(in_message))\n",
    "        x = F.relu(self.fc2(x))\n",
    "        x = self.fc3(x)\n",
    "        transmitted = x / torch.sqrt(2*torch.mean(x**2))\n",
    "        return transmitted\n",
    "    \n",
    "class Decoder(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Decoder, self).__init__()\n",
    "        self.fc1 = nn.Linear(4+4, NN_R)\n",
    "        self.fc2 = nn.Linear(NN_R, NN_R)\n",
    "        self.fc3 = nn.Linear(NN_R, NN_R)\n",
    "        self.fc4 = nn.Linear(NN_R, M)\n",
    "    def forward(self, in_message, in_channel):\n",
    "        nn_input = torch.cat([in_message,in_channel],-1)\n",
    "        x = F.relu(self.fc1(nn_input))\n",
    "        x = F.relu(self.fc2(x))\n",
    "        x = F.relu(self.fc3(x))\n",
    "        decoded = F.log_softmax(self.fc4(x), dim=-1)\n",
    "        return decoded\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "encoder = Encoder().to(device)\n",
    "decoder = Decoder().to(device)\n",
    "\n",
    "\n",
    "criterion= nn.NLLLoss()\n",
    "opt = Adam(list(encoder.parameters())+list(decoder.parameters()), lr=0.001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch = 0\n",
      "epoch = 1\n",
      "epoch = 2\n",
      "epoch = 3\n",
      "epoch = 4\n",
      "epoch = 5\n",
      "epoch = 6\n",
      "epoch = 7\n",
      "epoch = 8\n",
      "epoch = 9\n",
      "epoch = 10\n",
      "epoch = 11\n",
      "epoch = 12\n",
      "epoch = 13\n",
      "epoch = 14\n",
      "epoch = 15\n",
      "epoch = 16\n",
      "epoch = 17\n",
      "epoch = 18\n",
      "epoch = 19\n"
     ]
    }
   ],
   "source": [
    "loss = np.array([])\n",
    "batch = 200000\n",
    "# batch = 2000\n",
    "\n",
    "csi_real_set = torch.randn((M*batch, 2,1))/np.sqrt(2)\n",
    "csi_imag_set = torch.randn((M*batch, 2,1))/np.sqrt(2)\n",
    "\n",
    "data_set = data.TensorDataset(csi_real_set, csi_imag_set)\n",
    "training_generator = data.DataLoader(data_set, batch_size=2048, shuffle=True, num_workers=4)\n",
    "\n",
    "for epoches in np.arange(20):\n",
    "    print('epoch =', epoches)\n",
    "    for ch_real, ch_imag in training_generator:\n",
    "        csi_real = ch_real.to(device)\n",
    "        csi_imag = ch_imag.to(device)\n",
    "        \n",
    "        messages = np.random.randint(0,M, csi_real.shape[0])\n",
    "        \n",
    "        train_data = torch.from_numpy(to_categorical(messages)).to(device)\n",
    "        train_label = torch.from_numpy(messages).long().to(device)\n",
    "        \n",
    "\n",
    "        transmitted =encoder(train_data)\n",
    "        tx_real = transmitted[:, np.arange(0,4)].view(-1,2,2)\n",
    "        tx_imag = transmitted[:, np.arange(4,8)].view(-1,2,2)\n",
    "        \n",
    "        rx_real = torch.bmm(tx_real, csi_real) - torch.bmm(tx_imag, csi_imag)\n",
    "        rx_imag = torch.bmm(tx_real, csi_imag) + torch.bmm(tx_imag, csi_real)\n",
    "        \n",
    "        rx = torch.cat([rx_real, rx_imag], axis=-2).view(-1,4)\n",
    "      \n",
    "        sigma = np.sqrt(0.5/(np.power(10, train_snr/10)))\n",
    "        noise = (sigma * torch.randn(rx.shape)).to(device)\n",
    "        rx = rx + noise\n",
    "        \n",
    "        csi = torch.cat([csi_real, csi_imag], axis=-2).view(-1,4)\n",
    "        \n",
    "        y_pred = decoder(rx, csi)\n",
    "        cross_entropy = criterion(y_pred, train_label)\n",
    "        \n",
    "        opt.zero_grad()\n",
    "       \n",
    "        cross_entropy.backward()\n",
    "        opt.step()\n",
    "      \n",
    "\n",
    "    l = cross_entropy.to('cpu').detach().numpy()\n",
    "    loss = np.append(loss, l)\n",
    "    \n",
    "        \n",
    "        \n",
    "        \n",
    "        \n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(20,)\n",
      "[0.0080555  0.00811348 0.00817146 0.00822944 0.00828741 0.00834539\n",
      " 0.00791129 0.00771348 0.00752331 0.00786079 0.00731485 0.00845758\n",
      " 0.00812069 0.00697618 0.00695291 0.00674387 0.00653484 0.0063258\n",
      " 0.00611677 0.00590773]\n",
      "(20,)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(loss.shape)\n",
    "from scipy.ndimage.filters import gaussian_filter1d\n",
    "from scipy.optimize import curve_fit\n",
    "from scipy.signal import savgol_filter \n",
    "import tikzplotlib\n",
    "\n",
    "\n",
    "qqq = loss\n",
    "\n",
    "\n",
    "# plt.figure()\n",
    "# plt.loglog(loss)\n",
    "\n",
    "aaa = np.array(savgol_filter(qqq,11,1))\n",
    "print(aaa)\n",
    "print(aaa.shape)\n",
    "\n",
    "x = np.arange(1,aaa.shape[0]+1)*1024\n",
    "\n",
    "data = np.concatenate([x.reshape(-1,1), aaa.reshape(-1,1)], -1)\n",
    "\n",
    "np.savetxt('open_loss.txt', data[::100,:])\n",
    "\n",
    "plt.loglog(data[::100,0],data[::100,1])\n",
    "import tikzplotlib\n",
    "tikzplotlib.save(\"open_loss.tex\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# checkpoint = torch.load('Autoencoder-alamouti-torch-model')\n",
    "# encoder.load_state_dict(checkpoint['encoder'])\n",
    "# decoder.load_state_dict(checkpoint['decoder'])\n",
    "# # tx_opt.load_state_dict(checkpoint['tx_opt'])\n",
    "# # rx_opt.load_state_dict(checkpoint['rx_opt'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "\n",
    "\n",
    "SER = np.array([])\n",
    "with torch.no_grad():\n",
    "    for test_snr in np.arange(0,26,2):\n",
    "        ser_temp = np.array([])\n",
    "        for temp in np.arange(100):\n",
    "            batch = 40\n",
    "            messages = np.arange(M)\n",
    "            messages = np.tile(messages, batch)\n",
    "            test_labels = to_categorical(messages)\n",
    "\n",
    "            csi_real = (torch.randn((M*batch, 2,1))/np.sqrt(2)).to(device)\n",
    "            csi_imag = (torch.randn((M*batch, 2,1))/np.sqrt(2)).to(device)\n",
    "\n",
    "\n",
    "            test_data = torch.from_numpy(test_labels).to(device)\n",
    "            test_label = torch.from_numpy(messages).to(device)\n",
    "\n",
    "            transmitted =encoder(test_data)\n",
    "            tx_real = transmitted[:, np.arange(0,4)].view(-1,2,2)\n",
    "            tx_imag = transmitted[:, np.arange(4,8)].view(-1,2,2)\n",
    "\n",
    "            rx_real = torch.bmm(tx_real, csi_real) - torch.bmm(tx_imag, csi_imag)\n",
    "            rx_imag = torch.bmm(tx_real, csi_imag) + torch.bmm(tx_imag, csi_real)\n",
    "\n",
    "            rx = torch.cat([rx_real, rx_imag], axis=-2).view(-1,4)\n",
    "\n",
    "\n",
    "            sigma = np.sqrt(0.5/(np.power(10, test_snr/10)))\n",
    "            noise = (sigma * torch.randn(rx.shape)).to(device)\n",
    "            rx = rx + noise\n",
    "\n",
    "            csi = torch.cat([csi_real, csi_imag], axis=-2).view(-1,4)\n",
    "\n",
    "            y_pred = decoder(rx, csi)\n",
    "\n",
    "            classification = torch.argmax(y_pred, axis=-1).to('cpu').detach().numpy()\n",
    "\n",
    "            correct = np.equal(classification , messages)\n",
    "\n",
    "\n",
    "            ser = 1- np.mean(correct)\n",
    "\n",
    "            ser_temp = np.append(ser_temp, ser)\n",
    "        ser_ave = np.mean(ser_temp)\n",
    "\n",
    "\n",
    "\n",
    "        SER = np.append(SER ,ser_ave)\n",
    "    \n",
    "\n",
    "\n",
    "        \n",
    "        \n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f78805e0710>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x648 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data = io.loadmat('baseline/Alamouti_SER_theory-4QAM.mat')\n",
    "\n",
    "base_line = np.array(data['ser'])\n",
    "\n",
    "plt.figure(figsize=(16,9))\n",
    "\n",
    "pl1, pl2 = plt.semilogy(np.arange(0,22), base_line[0,0:22], '-*',\n",
    "                           np.arange(0,26,2), SER, '-<')\n",
    "# , SNR_array, SER, '-o'\n",
    "plt.grid()\n",
    "plt.legend([pl1, pl2],['Baseline', \n",
    "                           'AlamotiEncoderLearntDecoder'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[3.5700e-01 2.8920e-01 2.4130e-01 1.9580e-01 1.4550e-01 1.0940e-01\n",
      "  8.2400e-02 5.6000e-02 4.1700e-02 2.9200e-02 1.9756e-02 1.3086e-02\n",
      "  8.8660e-03 5.7840e-03 3.8160e-03 2.4580e-03 1.6020e-03 9.7500e-04\n",
      "  6.6100e-04 3.9900e-04 2.6300e-04 1.7100e-04 9.8000e-05 5.0000e-05\n",
      "  4.8000e-05 2.4000e-05]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f78804a0bd0>]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data = io.loadmat('baseline/Alamouti_SER_theory-4QAM.mat')\n",
    "\n",
    "base_line = np.array(data['ser'])\n",
    "print(base_line)\n",
    "plt.semilogy(np.arange(26), base_line[0,:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# torch.save({\n",
    "#             'encoder': encoder.state_dict(),\n",
    "#             'decoder': decoder.state_dict(),\n",
    "#             'opt': opt.state_dict(),\n",
    "            \n",
    "#             }, 'Autoencoder-alamouti-torch-model')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3.51343750e-01 2.34046875e-01 1.43843750e-01 7.86406250e-02\n",
      " 3.84531250e-02 1.75781250e-02 8.23437500e-03 3.20312500e-03\n",
      " 1.23437500e-03 5.46875000e-04 2.96875000e-04 1.25000000e-04\n",
      " 6.25000000e-05]\n"
     ]
    }
   ],
   "source": [
    "print(SER)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(6400, 8)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Tx sym, Ant 2, T2')"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x648 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "batch = 400\n",
    "messages = np.arange(M)\n",
    "messages = np.tile(messages, batch)\n",
    "test_labels = to_categorical(messages)\n",
    "\n",
    "csi_real = (torch.randn((M*batch, 2,1))/np.sqrt(2)).to(device)\n",
    "csi_imag = (torch.randn((M*batch, 2,1))/np.sqrt(2)).to(device)\n",
    "\n",
    "\n",
    "test_data = torch.from_numpy(test_labels).to(device)\n",
    "test_label = torch.from_numpy(messages).to(device)\n",
    "\n",
    "transmitted_signals =encoder(test_data).to('cpu').detach().numpy()\n",
    "\n",
    "    \n",
    "print(transmitted_signals.shape)   \n",
    "\n",
    "fig, axs = plt.subplots(2, 2, figsize=(10,9))\n",
    "ax1 = axs[0, 0]\n",
    "ax2 = axs[0, 1]\n",
    "ax3 = axs[1, 0]\n",
    "ax4 = axs[1, 1]\n",
    "for axe in [ax1, ax2, ax3, ax4]:\n",
    "    axe.grid(True)\n",
    "    axe.set_xlim([-1.5, 1.5])\n",
    "    axe.set_ylim([-1.5, 1.5])\n",
    "    axe.set_xlabel('Real')\n",
    "    axe.set_ylabel('Imaginary')\n",
    "\n",
    "\n",
    "color_map = ['r', 'b', 'g','r','c', 'm','y','k','w','r', 'b', 'g','r','c', 'm','y','k','w']\n",
    "marker_style = ['o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X','o']\n",
    "\n",
    "for i in  np.arange(4):\n",
    "    ax1.scatter(transmitted_signals[i,0], transmitted_signals[i,4], c=color_map[i], s=80, marker=marker_style[i])\n",
    "    ax2.scatter(transmitted_signals[i,1], transmitted_signals[i,5], c=color_map[i], s=80, marker=marker_style[i])\n",
    "    ax3.scatter(transmitted_signals[i,2], transmitted_signals[i,6], c=color_map[i], s=80, marker=marker_style[i])\n",
    "    ax4.scatter(transmitted_signals[i,3], transmitted_signals[i,7], c=color_map[i], s=80, marker=marker_style[i])\n",
    "\n",
    "\n",
    "\n",
    "ax1.set_title('Tx sym, Ant 1, T1')\n",
    "ax2.set_title('Tx sym, Ant 2, T1')\n",
    "ax3.set_title('Tx sym, Ant 1, T2')\n",
    "ax4.set_title('Tx sym, Ant 2, T2')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": true,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
